home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
aminet
/
misc
/
amag
/
9301b.lha
/
Schach
/
Sourcecode
/
Brett.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-12-15
|
5KB
|
189 lines
/*
* Die Funktionen Dateiausdrucken und SpielstaerkeAnzeige
* von rz am 15/12/92 zusätzlich implementiert, ebenso
* die Ausgabe des aktuellen Status in der Screenleiste
*/
/* Brett.c */
#include "Adt.h"
extern void SpielstaerkeAnzeige(void);
struct Ereignis * WarteEreignis();
struct Zugstat * BesterZug();
/* globales Spielbrett: */
Figur s[ 9 ][ 9 ];
/* Spielstärke: 2 = leicht, 3 = schwerer etc. */
int Spielstaerke=2;
main()
{
int i, j, spende;
struct Ereignis *e;
struct Zugstat *zs;
Special sp;
OeffneDisplay();
if( !WillLaden( s, &sp ) ) {
/* Spielbrett initialisieren: */
s[ 1 ][ 1 ] = wturm; s[ 1 ][ 8 ] = sturm;
s[ 2 ][ 1 ] = wspringer; s[ 2 ][ 8 ] = sspringer;
s[ 3 ][ 1 ] = wlaeufer; s[ 3 ][ 8 ] = slaeufer;
s[ 4 ][ 1 ] = wdame; s[ 4 ][ 8 ] = sdame;
s[ 5 ][ 1 ] = wkoenig; s[ 5 ][ 8 ] = skoenig;
s[ 6 ][ 1 ] = wlaeufer; s[ 6 ][ 8 ] = slaeufer;
s[ 7 ][ 1 ] = wspringer; s[ 7 ][ 8 ] = sspringer;
s[ 8 ][ 1 ] = wturm; s[ 8 ][ 8 ] = sturm;
for( i=1; i<=8; i++ ){
s[ i ][ 2 ] = wbauer; s[ i ][ 7 ] = sbauer;
for( j=3; j<=6; j++ )
s[ i ][ j ] = leer;
}
sp = wroch | sroch;
}
ZeichneBrett( s, weiss );
SpielstaerkeAnzeige();
spende = 0;
while( 1 ) {
e = WarteEreignis( s, weiss );
switch( e->ereignistyp ) {
case zugs:
if( !spende ) {
ZeichneStat( s, 0L );
ZeichneZug( s, &(e->zug), weiss, &sp );
if( IstSchach( s, schwarz, 0, sp ) )
if( IstMatt( s, schwarz, sp ) ) {
NotierAdd( "++" );
NotierZug( "-Matt-" );
spende = 1; break;
} else
NotierAdd( " +" );
if( IstPatt( s, schwarz, sp ) ) {
NotierZug( "-Patt-" );
spende = 1; break;
}
zs = BesterZug( s, schwarz, Spielstaerke, sp );
ZeichneZug( s, &(zs->zug), weiss, &sp );
ZeichneStat( s, zs );
if( IstSchach( s, weiss, 0, sp ) )
if( IstMatt( s, weiss, sp ) ) {
NotierAdd( "++" );
NotierZug( "-Matt-" );
spende = 1; break;
} else
NotierAdd( " +" );
if( IstPatt( s, weiss, sp ) ) {
NotierZug( "-Patt-" );
spende = 1; break;
}
}
break;
case ende:
if( WillBeenden( s, sp ) ) {
SchliesseDisplay();
exit( 0 );
}
break;
}
}
}
ZeichneZug( s, z, fa, sp )
Figur s[ 9 ][ 9 ];
struct Zug *z;
Farbe fa;
Special *sp;
{
char notat[ 7 ], *st;
int sx, sy, zx, zy;
Figur fi;
/* ausführliche Notation: */
switch( z->figur & figmask ) {
case bauer: notat[ 0 ] = ' '; break;
case springer: notat[ 0 ] = 'S'; break;
case laeufer: notat[ 0 ] = 'L'; break;
case turm: notat[ 0 ] = 'T'; break;
case dame: notat[ 0 ] = 'D'; break;
case koenig: notat[ 0 ] = 'K'; break;
}
sx = z->start >> 4; sy = z->start & yposmask;
zx = z->ziel >> 4; zy = z->ziel & yposmask;
notat[ 1 ] = sx-1+'a';
notat[ 2 ] = sy+'0';
notat[ 3 ] = s[ zx ][ zy ] == leer ? '-' : 'x';
notat[ 4 ] = zx-1+'a';
notat[ 5 ] = zy+'0';
notat[ 6 ] = 0;
st = ( notat[ 0 ] == ' ' ) ? &(notat[ 1 ]) : notat;
/* Special - Variable aktualisieren: */
*sp &= ~epmask;
if( (z->figur&figmask)==bauer && (zy-sy==2 || sy-zy==2) )
*sp |= sx;
if( (z->figur&figmask)==koenig )
if( (z->figur&farbmask)==weiss )
*sp &= ~wroch;
else
*sp &= ~sroch;
if( (z->figur&figmask)==turm )
if( (z->figur&farbmask)==weiss ) {
if( sx==1 )
*sp &= ~wlroch;
else if( sx==8 )
*sp &= ~wkroch;
} else
if( sx==1 )
*sp &= ~slroch;
else if( sx==8 )
*sp &= ~skroch;
/* Zug ausführen */
fi = s[zx][zy]; s[sx][sy] = leer;
if( (z->figur&figmask)==koenig && (zx-sx==2 || sx-zx==2) ) {
s[zx][zy] = z->figur;
if( zx==7 ) {
s[6][sy] = s[8][sy]; s[8][sy] = leer;
NotierZug( "O-O" );
} else {
s[4][sy] = s[1][sy]; s[1][sy] = leer;
NotierZug( "O-O-O" );
}
} else if( (z->figur&figmask)==bauer && fi==leer && sx!=zx ) {
s[zx][zy] = z->figur; s[zx][sy] = leer;
notat[3] = 'x';
NotierZug( st );
NotierAdd( "ep" );
} else if( (z->figur&figmask)==bauer && (zy==1 || zy==8) ) {
s[zx][zy] = (z->figur&farbmask)|dame;
NotierZug( st );
NotierAdd( "D" );
} else {
NotierZug( st );
s[zx][zy] = z->figur;
}
/* Zug sichtbar machen: */
BlinkFeld( z->start, fa );
ZeichneFigur( leer, z->start, fa );
ZeichneFigur( s[ zx ][ zy ], z->ziel, fa );
if( (z->figur&figmask)==koenig && (zx-sx==2 || sx-zx==2) )
if( zx-sx==2 ) {
ZeichneFigur( s[8][sy], 8<<4|sy, fa );
ZeichneFigur( s[6][sy], 6<<4|sy, fa );
} else {
ZeichneFigur( s[1][sy], 1<<4|sy, fa );
ZeichneFigur( s[4][sy], 4<<4|sy, fa );
}
if( (z->figur&figmask)==bauer && sx!=zx )
ZeichneFigur( s[zx][sy], zx<<4|sy, fa );
BlinkFeld( z->ziel, fa );
}